# Как запустить воркшоп

1. `git clone https://gitverse.ru/sc/dtirskikh/kafka-spark-demo.git`
2. `cd kafka-spark-demo`
3. `В файл akhq/app/application.yml ввести пароль от Кафки Yandex Practicum (есть в спринте 8)`
4. `docker-compose build`
5. `docker-compose up`

![img.png](img/docker-compose-content.jpg)

### NIFI 
https://localhost:18443/nifi \
При обращении к адресу проигнорировать ошибку сертификата. Потом отказаться от применения локальных сертификатов.


Для NiFi в docker-compose.yml пробрасывается volume.
```
volumes:
      - ./nifi/conf:/opt/nifi/nifi-current/conf
```
Проброс позволяет использовать ранее подготовленные пайплайны и сгенерированные креды.
```
Username 8e55070e-822d-4ec3-a1ba-e082f296a4ac
Password S3NQ4mar9GgOboq912GX2Nq2KpjBnKcb
```

Но такой подход не всегда работает и NiFi может не запускаться.
В случае проблемы необходимо закомментировать проброс в docker-compose.yml
```
    #volumes:
    #  - ./nifi/conf:/opt/nifi/nifi-current/conf
```
Данная конфигурация не включает никаких пайплайнов. Креды генерируются при создании контейнера и находятся в логах. \
Быстрый поиск кредов осуществляется командой:
```
docker logs nifi_dev 2>&1 | grep "Generated Username\|Generated Password"
Generated Username [b121c36d-e817-434c-ad02-90b6418020a2]
Generated Password [t3nKJ3f2DH8OO97uGSYi2mGCpybIlW6+]
```


### AKHQ
http://127.0.0.1:8081 \
В файл akhq/app/application.yml ввести пароль от Кафки Yandex Practicum (есть в спринте 8)


### Jupyter
http://127.0.0.1:8888/

Необходимо в логах контейнера найти ссылку с токеном
```
docker logs pyspark 2>&1 | grep "?token"
```
Ссылка будет примерно такой, только с другим токеном \
http://127.0.0.1:8888/lab?token=e4b7a12929435fbe981ffaf422eadef31f0cbf567ba62cd1

### Kafka local
Создать топик с помощью утилиты kafka-topics через контейнер kafka
```
docker exec -it kafka /bin/bash
kafka-topics --bootstrap-server localhost:9092 \
--topic yap-topic-parts --create --if-not-exists \
--partitions 4
```


Запустить producer c хоста (консоль вне докера). \
`-K:` значаит будет ключ, а через двоеточие само сообщение. Например, `1:{"a": 1} `
```
kcat -b localhost:29092 -t yap-topic-parts -P -K:
```

Запустить consumer
`-K " "` значит выводить ключ сообщения через пробел

```
kcat -b localhost:29092 -t yap-topic-parts -C -K " "
```
Также можно добавить форматирование вывода сообщений:" `-f 'Key: %k\nValue: %s\n'`. \
Описание  
https://docs.confluent.io/platform/current/clients/examples/kcat.html \
https://docs.confluent.io/platform/current/tools/kafkacat-usage.html  \
https://www.conduktor.io/blog/understanding-kafkas-internal-storage-and-log-retention/

--

С контейнера адрес брокера будет `kafka:9092`. \
Например, можно использовать контейнер pyspark
```
docker exec -it pyspark /bin/bash
```
И в нём уже запускать продюсера
```
kafkacat -b kafka:9092 -t yap-topic-parts -P -K:
```
Или консъюмера
```
kafkacat -b kafka:9092 -t yap-topic-parts -C 
```

Также можно явно писать в конкретную партцию `-p <num_prt>`

kcat == kafkacat. Эта одна и та же утилита

-----------

Физические файлы можно посмотреть внутри контейнера Kafka
```
docker exec -it kafka /bin/bash
ls /var/lib/kafka/data/
```

Расшифровать файлы .log | .index | .timeindex | ... 

`.log` - файл с данными \
`.index` - маппинг офсета сообщения в байтоовое смещение в партиции \
`.index` - маппинг timestamp сообщения в байтовое смещение в партиции 

`index.interval.bytes` - настройка обновления индексных файлов. По умолчанию, 4096 байт
```
kafka-run-class kafka.tools.DumpLogSegments --deep-iteration --print-data-log --files /path/to/file
```

Настройки 
```
docker exec -it kafka /bin/bash
ls /etc/kafka
```

### Postgres
При инициализации запускается скрипт `postgres/docker-entrypoint-initdb.d/migration.sql` \
Подготавливаются тестовая схема \
Есть 2 пользователя
```
user: postgres, password: example
user: ya_practicum, password: ya_practicum
```
